package com.sqsf.util;

import com.sqsf.javabean.User;
import mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;

public class UserTest {
    SqlSession session;
    UserMapper mapper;
    @Before
    public void a() {
        //1、创建SqlSessionFactory对象，也是单例模式的
        SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
        //2、创建SqlSession对象 true 自动提交事务 不写也没事 因为默认在sqlsession关闭时提交事务
        session = factory.openSession(true);
        //3、调用session的方法namespace的名字.id
        mapper = session.getMapper(UserMapper.class);

    }

    @After
    public void b() {
        //5、关闭资源
        session.close();
    }
    //如下代码执行日志
    //每个方法执行日志会打印执行的sql
    //但是连续两次查询仅打印一次sql 中间修改后 再次查询重新执行sql
    //这是因为mybatis默认开启一级缓存
    //会将sql查询的结果存储在当前会话中 当再次查询时 不会执行sql直接返回结果
    //前提是 中间没有进行修改操作
    @Test
    public void selectAll() {
        mapper.selectAll();
        System.out.println("~~~~~~~~~~~~~~1");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~~~~~2");
        //mapper.updateNameById(1,"aaa");
        System.out.println("~~~~~~~~~~~~~~3");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~~~~~4");
    }
    //因为一级缓存存储在会话中 所以第二个测试方法执行后
    //又执行了一次sql语句

    //如果想实现不同的会话共享缓存 就需要开启二级缓存了
    //二级缓存可以理解存储在服务器
    //前一个会话结束后 会将其一级缓存 发送存储到服务器二级缓存
    //这样其他会话就可以直接使用了
    //使用二级缓存条件
    //1)在对应的mapper中开启二级缓存 书写缓存标签
    //2)因为存储在服务器 需要对应的类实现序列化接口
    @Test
    public void selectAll1() {
        mapper.selectAll();
        System.out.println("~~~~~~~~~~~~~~1");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~~~~~2");
    }
    @Test
    public void insertUser(){
        User u=new User("rg3",200,new Date());
        mapper.insertUser(u);
    }

    @Test
    public void insertUser1(){
        User u=new User("rg3-1",200,new Date());
        mapper.insertUser1(u);
        System.out.println(u);
    }

    @Test
    public void insertUser2(){
        User u=new User("rg3-2",200,new Date());
        mapper.insertUser2(u);
        System.out.println(u);
    }
}